/*
 * @Author: Zyunchao 18651805393@163.com
 * @Date: 2022-04-25 17:05:56
 * @LastEditors: Zyunchao 18651805393@163.com
 * @LastEditTime: 2024-03-15 16:09:39
 * @FilePath: /micro-temp-monorepo/_core/microMain/parentDataMsgHandle.ts
 * @Description: 微应用接收基座数据的核心文件，这里统一接收，然后分发出去
 */
import type { RootStateTypes } from '@jsjn/micro-core-store/interface'
import type { RouteLocationNormalized, RouteLocationRaw } from 'vue-router'
import router from '@jsjn/micro-core-router'
import setLocalStore from './setLocalStore'
import {
    setIterceptorsReqHandle,
    setIterceptorsResHandle,
    interceptorsReqHandle,
    interceptorsResHandle
} from './httpInterceptors'
import type { ReqHandle, ResHandle } from './httpInterceptors'
import { routeMode, setRouteMode } from './routeMode'
import { FormGenerateProps } from 'jn-ve-global'
import store from '@jsjn/micro-core-store'
import _ from 'lodash'

export interface ParentMsgData {
    /**
     * 路由跳转的消息
     */
    to: RouteLocationNormalized
    /**
     * store 注入 || 改变的消息
     */
    vuex: RootStateTypes
    /**
     * 公用请求拦截
     */
    interceptorsReqHandle: ReqHandle
    /**
     * 公用响应拦截
     */
    interceptorsResHandle: ResHandle
    /**
     * 路由模式，微应用的路由模式不再由本地环境变量配置
     * 微应用的要和基座应用的保持统一
     */
    routeMode: 'backEnd' | 'frontEnd'
    /**
     * 工作流下的接收追加的表单配置项
     */
    remoteSupplementalFormConfig?: FormGenerateProps
}

export default (parentData: ParentMsgData) => {
    const {
        to,
        vuex,
        interceptorsReqHandle: remoteReqHandle,
        interceptorsResHandle: remoteResHandle,
        routeMode: remoteRouteMode
    } = parentData

    // 请求拦截
    if (interceptorsReqHandle === null && remoteReqHandle) {
        setIterceptorsReqHandle(remoteReqHandle)
    }

    // 响应拦截
    if (interceptorsResHandle === null && remoteResHandle) {
        setIterceptorsResHandle(remoteResHandle)
    }

    // 路由模式
    if (routeMode === null && remoteRouteMode) {
        setRouteMode(remoteRouteMode)
    }

    // 存储
    if (vuex) {
        setLocalStore(vuex)
    }

    /**
     * 跳转
     *
     * 放弃 name 传递导航（子应用，基座应用中依旧可以使用 name 导航）：
     * 在使用路由对象（包含 path、name 的整体对象）跳转时，name 的优先级要高于 path
     * 在工作流微应用容器中，跳转路由的 name 将始终保持为 workflow-root
     * 导致子应用的路由无法正常激活
     * 所以需要抛弃 name 导航
     *
     * 且注意：
     * 在应用初始化的时候，是不会触发当前的主动导航的，当前的主动导航仅适用于子应用处于激活（存活）状态时
     * 这样一来，如果没有使用主动导航，路由中的 params 将丢失
     * 因此：规范开发中跨应用跳转不要使用 params
     *
     * 注意：
     *  - name 可以和 query 混用
     *  - path 不可以和 params 混用
     */
    if (to) {
        // 无界保活下，微应用激活如果和失活时的页面一致，则需要刷新；
        if (window['__LAST_ROUTE__']?.path === to.path) {
            router.replace('/')
            setTimeout(() => {
                router.replace({ ...to, name: '' } as RouteLocationRaw)
            }, 0)
            return
        }
        window['__LAST_ROUTE__'] = undefined
        router.replace({ ...to, name: '' } as RouteLocationRaw)
    }
}
